package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.Element;
import br.com.hs.nfe.common.anotation.TypeEnum;
import br.com.hs.nfe.common.enumeration.IPIEnum;
import br.inf.portalfiscal.nfe.TNFe.InfNFe.Det.Imposto.IPI;
import java.math.BigDecimal;

/**
 * Classe de informaçãoes do imposto sobre produtos industrializados - IPI.
 * @author Ranlive Hrysyk
 */
public class IpiTO extends BaseTO {

    @Element(elementName = "CST", publicName = "Cód. Situação Tributária IPI", type = TypeEnum.ENUM, classType = {IPI.IPITrib.CST.Enum.class, IPI.IPINT.CST.Enum.class})
    private IPIEnum cst;
    @Element(publicName = "Classe Enquadramento IPI", type = TypeEnum.CARACTER, min = 1, max = 5, required = false)
    private String clEnq;
    @Element(elementName = "CNPJProd", publicName = "CNPJ do Produtor", type = TypeEnum.CARACTER, min = 14, max = 14, required = false)
    private String cnpjProd;
    @Element(publicName = "Cód. Selo de Controle IPI", type = TypeEnum.CARACTER, min = 1, max = 60, required = false)
    private String cSelo;
    @Element(publicName = "Qtde. Selo de Controle IPI", type = TypeEnum.NUMBER, min = 1, max = 12, required = false)
    private String qSelo;
    @Element(publicName = "Cód. Enquadramento Legal IPI", type = TypeEnum.CARACTER, min = 3, max = 3)
    private String cEnq;
    @Element(publicName = "Valor da BC do IPI", type = TypeEnum.DECIMAL, decimalCount = 2)
    private BigDecimal vBC;
    @Element(publicName = "Alíq. do IPI", type = TypeEnum.DECIMAL, decimalCount = 2)
    private BigDecimal pIPI;
    @Element(publicName = "Qtde. Total", type = TypeEnum.DECIMAL, decimalCount = 4)
    private BigDecimal qUnid;
    @Element(publicName = "Valor Unidade Tributável", type = TypeEnum.DECIMAL, decimalCount = 4)
    private BigDecimal vUnid;
    @Element(publicName = "Valor IPI", type = TypeEnum.DECIMAL, decimalCount = 2)
    private BigDecimal vIPI;

    /**
     * Código da Situação Tributária do IPI.
     */
    public IPIEnum getCSTEnum() {
        return cst;
    }

    /**
     * Código da Situação Tributária do IPI.
     */
    public String getCST() {
        if (cst != null) {
            return cst.getCST();
        }
        return null;
    }

    /**
     * Informar o código da situação tributária do IPI.
     * @param cst Código da Situação Tributária do IPI.
     */
    public void setCSTEnum(IPIEnum cst) {
        this.cst = cst;
    }

    /**
     * Informar o código da situação tributária do IPI.
     * <p>Este campo deverá ser obrigatoriamente preenchido com:
     * <br>00 - Entrada com recuperação de crédito;
     * <br>01 - Entrada tributada com alíquota zero;
     * <br>02 - Entrada isenta;
     * <br>03 - Entrada não-tributada;
     * <br>04 - Entrada imune;
     * <br>05 - Entrada com suspensão;
     * <br>49 - Outras entradas;
     * <br>50 - Saída tributada;
     * <br>51 - Saída tributada com alíquota zero;
     * <br>52  - Saída isenta;
     * <br>53 - Saída não-tributada;
     * <br>54 - Saída imune;
     * <br>55 - Saída com suspensão;
     * <br>99 - Outras saídas.
     * </p>
     * @param cst Código da Situação Tributária do IPI.
     */
    public void setCST(String cst) {
        this.cst = IPIEnum.getEnumByCodigo(cst);
    }

    /**
     * Classe de Enquadramento do IPI.
     */
    public String getClEnq() {
        return clEnq;
    }

    /**
     * Informar a classe de enquadramento do IPI para Cigarros e Bebidas.
     * @param clEnq Classe de Enquadramento do IPI
     */
    public void setClEnq(String clEnq) {
        this.clEnq = clEnq;
    }

    /**
     * CNPJ do Produtor.
     */
    public String getCNPJProd() {
        return cnpjProd;
    }

    /**
     * Informar o CNPJ do produtor da mercadoria, quando diferente do emitente. Somente para os
     * casos de exportação direta ou indireta.
     * @param cnpjProd CNPJ do Produtor
     */
    public void setCNPJProd(String cnpjProd) {
        this.cnpjProd = cnpjProd;
    }

    /**
     * Código do Selo de Controle do IPI.
     */
    public String getCSelo() {
        return cSelo;
    }

    /**
     * Informar o código do Selo de controle do IPI.
     * @param cSelo Código do Selo de Controle do IPI
     */
    public void setCSelo(String cSelo) {
        this.cSelo = cSelo;
    }

    /**
     * Quantidade do Selo de Controle do IPI.
     */
    public String getQSelo() {
        return qSelo;
    }

    /**
     * Informar a quantidade do selo de controle do IPI.
     * @param qSelo Quantidade do Selo de Controle do IPI
     */
    public void setQSelo(String qSelo) {
        this.qSelo = qSelo;
    }

    /**
     * Código de Enquadramento Legal do IPI.
     */
    public String getCEnq() {
        return cEnq;
    }

    /**
     * Informar o código de enquadramento legal do IPI.
     * @param cEnq Código de Enquadramento Legal do IPI
     */
    public void setCEnq(String cEnq) {
        this.cEnq = cEnq;
    }

    /**
     * Valor da BC do IPI.
     */
    public BigDecimal getVBC() {
        return vBC;
    }

    /**
     * Informar o valor da base de cálculo do IPI.
     * @param vBC Valor da BC do IPI
     */
    public void setVBC(BigDecimal vBC) {
        this.vBC = vBC;
    }

    /**
     * Alíquota do IPI.
     */
    public BigDecimal getPIPI() {
        return pIPI;
    }

    /**
     * Informar a alíquota do IPI.
     * @param pIPI Alíquota do IPI
     */
    public void setPIPI(BigDecimal pIPI) {
        this.pIPI = pIPI;
    }

    /**
     * Quantidade Total na Unidade Padrão.
     */
    public BigDecimal getQUnid() {
        return qUnid;
    }

    /**
     * Informar a quantidade total na unidade padrão para tributação (somente para os produtos tributados por unidade).
     * @param qUnid Quantidade Total na Unidade Padrão
     */
    public void setQUnid(BigDecimal qUnid) {
        this.qUnid = qUnid;
    }

    /**
     * Valor por Unidade Tributável.
     */
    public BigDecimal getVUnid() {
        return vUnid;
    }

    /**
     * Informar o valor por unidade tributável.
     * @param vUnid Valor por Unidade Tributável
     */
    public void setVUnid(BigDecimal vUnid) {
        this.vUnid = vUnid;
    }

    /**
     * Valor do IPI.
     */
    public BigDecimal getVIPI() {
        return vIPI;
    }

    /**
     * Informar o valor do IPI.
     * @param vIPI Valor do IPI
     */
    public void setVIPI(BigDecimal vIPI) {
        this.vIPI = vIPI;
    }
}
